字符串
标准库提供了一个 string
类型,作为前面所用的字符串文字量的补充。这个 string
类型提供了许多很有用的字符串操作,例如串拼接等。请看这个例子:
string s1 = "Hello";
string s2 = "world";
void m1()
{
string s3 = s1 + "," + s1 + "!\n";
cout << s3;
}
在这里,s3 被初始化为如下的字符序列
Hello,world!
随后是一个换行符。对于字符串的加法表示的就是拼接。你可以将一个字符串,或一个字符串文字量,或一个字符加到一个字符串上。
在许多应用中,最常见的拼接形式是将某些东西追加到一个字符串的末尾。操作 +=
直接支持这种工作。例如
void m2(string& s1, string& s2)
{
s1 = s1 + '\n'; // 追加换行符
s2 += '\n'; // 追加换行符
}
这两种在字符串末尾追加的方式在语义上是等价的。但我喜欢后面的一种,因为它更紧凑,实现效率也可能更高一些。
很自然,string
可以相互比较,也可以与一个字符串文字量比较。例如,
string incantation;
void respond(const string& answer)
{
if(answer == incantation)
{
// perform magic
}
else if(answer == "yes")
{
// ...
}
// ...
}
标准库的字符串类将在第20章中描述。在其他有用的特征中,还提供了操纵子字符串的功能。例如,
string name = "Niels Stroustrup";
void m3()
{
string s = name.substr(6, 10); // s = "Stroustrup"
name.replace(0, 5, "Nicholas"); // name变成“Nichiolas Stroustrup”
}
这里的 substr()
运算返回一个字符串,它就是函数参数所指明的那个子串的副本。第一个参数是在本字符串里的一个下标(位置),第二个参数是所需子串的长度。因为下标开始于0,所以 s
得到的值是 Stroustrup
。
replace()
操作用一个值替换掉指定的子串。在上面情况中,开始于位置 0 长 5 的子串是 Niels
,它被用 Nicholas
取代。这样,name
最后的值就是 Nicholas Stroustrup
。请注意,作为替代的串不必与被它替换的子串一样长。
🔚